{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "30afd80a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "1f311c7f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "urdf_path = os.path.join(os.getenv(\"HELLO_FLEET_PATH\"), os.getenv(\"HELLO_FLEET_ID\"), \"exported_urdf\", \"stretch.urdf\")\n",
    "mesh_path = os.path.join(os.getenv(\"HELLO_FLEET_PATH\"), os.getenv(\"HELLO_FLEET_ID\"), \"exported_urdf\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "e0691c2c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Jupyter environment detected. Enabling Open3D WebVisualizer.\n",
      "[Open3D INFO] WebRTC GUI backend enabled.\n",
      "[Open3D INFO] WebRTCWindowSystem: HTTP handshake server disabled.\n"
     ]
    }
   ],
   "source": [
    "from pytransform3d.urdf import UrdfTransformManager\n",
    "import pytransform3d.transformations as pt\n",
    "import pytransform3d.visualizer as pv\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "191d2624",
   "metadata": {},
   "outputs": [],
   "source": [
    "tm = UrdfTransformManager()\n",
    "with open(urdf_path, \"r\") as f:\n",
    "    urdf = f.read()\n",
    "    tm.load_urdf(urdf, mesh_path=mesh_path)\n",
    "\n",
    "\n",
    "camera_transform = tm.get_transform('base_link', 'camera_link')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "72924e06",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Axes3DSubplot(0.125,0.125;0.775x0.755)\n"
     ]
    },
    {
     "data": {
      "image/png": "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2vguCiZl1FttijPENwBpouWtDT322GMaNGiQCgoKNH78eK1evfqY5y9YsEDDhw9Xp06dNHDgQN15552qqqpq0WPm5eVp7ty5uueee5SXl6fly5dLkqLRaNrPA0Dr2WR4a6TZTaLpDUDaCG9t5MUXX9ScOXM0f/58rV27VmPGjNEll1yiPXv2NHr+Cy+8oLlz52r+/PnasGGDnn76ab344ou655570nr8Q4cOafjw4Zo4caIk6c0339S2bdtSZrwBaE9GKXuZxqVMQGVvUwBpI7y1kUceeUS33nqrZs6cqZEjR+qJJ55QYWGhnnnmmUbPf+eddzRp0iRdf/31GjRokC6++GJdd911x22tO56uXbtKkkaNGqVNmzbp7bffbtX9AUiP69VbnTdlwRDmKwBoDcJbG6ipqdGaNWs0derU5DHHcTR16lStXLmy0WsmTpyoNWvWJMPa559/rtdff13Tpk1rk5r69eunCy64QCUlJZKkDz74QJWVlW1y3wCOz29lazyieZIMOywASBMTFtpAWVmZXNdV37596xzv27evNm7c2Og1119/vcrKyjR58mRZaxWLxfSP//iPaXebNiYUCmno0KHatGmTHMfR0qVLNWTIEA0aNKjNHgPAccQb3IxJBDorWSuyG4B00fKWJcuWLdN//dd/6ec//7nWrl2r3/3ud3rttdf0wAMPZOTxxowZo0mTJmnv3r166623JInxcEAGWat6DW+m7o388wOQJlre2kCvXr0UCoW0e/fuOsd3796d7Las795779UNN9ygW265RZI0evRoHTlyRLfddpu+//3vy3HaPld3795d5513nrZt26YPP/xQK1eu1Omnn66ioqI2fyygw7P+6DbPJL6um9ccmt4ApImWtzaQl5ensWPHasmSJcljnudpyZIlmjBhQqPXVFZWNghooVBIUmZbxIwxGjBggCQ/dL799tv68MMPM/Z4QEdlrW1yD1NjxPZYANJGeGsjc+bM0VNPPaXnnntOGzZs0Le//W0dOXJEM2fOlCTdeOON+t73vpc8//LLL9fjjz+uhQsXauvWrVq8eLHuvfdeXX755ckQl2mnnHKKLrjgAnnxfXw2b94s13Xb5bGBE139nRUsYQ1AG6HbtI1Mnz5de/fu1X333afS0lKdccYZWrRoUXISw/bt2+u0tM2bN0/GGM2bN087d+5U7969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yBBddtllMsbo97//fTs+kxMP4Q0AgA5k7ty5MsYc82Pjxo2NXjtjxgzFYjF95zvf0auvvqq33npLt912W51z7r33Xh04cEB//vOf9f7772vOnDm69tpr9W//9m+My24jjHkDAKAD2bt3r/bt23fMcwYPHqz/+Z//0V133aX9+/dLqh0D5ziOfvOb3+jrX/96gzFwW7Zs0dChQ/XRRx9p1KhRyfsbP368Pv74Y23evFn9+vXTK6+8oquuuiqTTzPI2NsUAADU6t27d7P2WZ0wYYIOHDigNWvWaOzYsVq5cqWKiopUUVGh//2//7euu+46nX766TLGaNWqVfr617+uyspKSaqzveH//M//6L333pMxRhdddFHGnldHQrcpAABo4NRTT9Wll16qW2+9VatXr9aqVat09OhROY6j+++/X2vXrtWwYcPkeZ6WLFkiSRoxYoSGDh2q22+/XatXr9bLL7+sG264QdZaPfbYY8nWtm3btmXxmQUf3aYAAHRgc+fO1UMPPXTMcwoLC+W6rqLRqG655RY9+eSTkqTPP/9cQ4YM0aRJk7RixQpJ0meffaa5c+dqxYoVKisrk7VWTz75pG699VZJkjFGF198sf74xz9m9okFF+u8AQCApjV3DNyzzz6bnDmaaEGLxWLKy8vT2WefrdWrVze4rkuXLqqoqKizl2tiR52vfe1rWrZsWZs9jxMIY94AAEDTmjsGbvjw4ZKUnMAgSUuXLpW1Vrt27dKgQYNUWlqqMWPG6NFHH9W4ceNUXV2thx56SNOmTUteM3r0aBUVFelXv/qVFi5cqOuuu05XXnkly4e0AOENAAAc17BhwyRJP/zhDzVq1ChFo1HNnj1b/fv3186dO/X0009r0KBB+vrXv66pU6dq8+bNkqSBAwfqtNNOq3NfoVBIxhjdfffdOu+889r9uQQdExYAAMBx9erVS6FQSH379tWFF16oadOmafLkyaqurtZXv/pVzZw5UyeffLIOHjyo/Px8PfPMMyopKdHu3bsb3FdxcbFmzJihH/zgBxo8eHAWnk2wEd4AAMBx5eXlaezYsRozZowOHz6sgwcP6uc//7n27dunyZMnS5IGDRoka62mTZumlStXasKECcmZqAkTJkxQz5491adPH82aNSsbTyXw6DYFAADNMmfOHN100006++yzNW7cOP3nf/6nJOlb3/qWJOnGG2/UgAED1LdvX7355puqrq5WaWmpTjrpJD388MP65JNPtHr1avXs2bPBbNMFCxbo8ccf1/bt29WrVy994xvf0IMPPqiCgoJ2f565jvAGAACaZfr06dq7d6/uu+8+lZaWauTIkZKkHj16SJK2b98ux3FUXl6u7du36+mnn9aBAwf0gx/8QNOnT9fQoUPVq1cv/epXv1KvXr2S97tjxw7NnTtXzzzzjCZOnKhNmzbp5ptvljFGjzzySFaeay5jqRAAAJCWmpoaFRYW6je/+U2d7a569+6toqIibd26VZLkeZ4GDhyoa665Ro8++midpUM8z1Mii2zevFlDhgyRJN11111atWpVcv24DuS4S4Uw5g0AAKQlMQ4udVxbVVWVysrKkuPgJH+7rKlTp2rr1q1av3691q1bl/y44oorNHLkSHXp0kWlpaWS/MV/X3/9dV166aWaOHGirr766jqPe/DgQQ0cOFDf//732+eJ5hjCG9pVeXm5ZsyYoa5du6q4uFizZs1SRUXFMa8pLS3VDTfcoJKSEnXu3FlnnXWWfvvb37ZTxbklndcvwVqryy67TMaYDrOe0mOPPaZBgwapoKBA48ePb3QR0VQvv/yyRowYoYKCAo0ePVqvv/56O1Wam1r6+iUsXLhQxpgOv/F4S1+/BQsWaPjw4erUqZMGDhyoO++8U1VVVe1UbfrmzJmjp556Ss8995w2bNigW265RVLdcXDf+9731LdvX+3Zs0ennXZanY/i4mINGzZM//Ef/6Hzzz9fkUhEQ4YM0ZQpUzRv3jw9++yzWrRokZ5//vnkY37nO99Rjx49NH/+/Kw856yz1jb3A2i1Sy+91I4ZM8a+++67dvny5Xbo0KH2uuuuO+Y1F110kT3nnHPsqlWr7JYtW+wDDzxgHcexa9eubaeqc0c6r1/CI488Yi+77DIryb7yyiuZLTQHLFy40Obl5dlnnnnGfvzxx/bWW2+1xcXFdvfu3Y2e//bbb9tQKGT/+7//237yySd23rx5NhKJ2PXr17dz5bmhpa9fwtatW+2AAQPseeedZ6+88sr2KTYHtfT1e/75521+fr59/vnn7datW+0f//hH269fP3vnnXe2c+XpefTRR+1JJ51k8/Ly7BlnnGEl2Xfeecdaa+3XvvY1e9NNN9nvfve7dty4cQ2uvemmm+ykSZNs37597VNPPWX/+te/2t/97nd24MCB9v7777fWWvvTn/7Udu/e3X755Zf297//vY1EInbdunXt+hzb0XEzGeEN7eaTTz6xkux7772XPPbGG29YY4zduXNnk9d17tzZ/vrXv65zrEePHvapp57KWK25KN3Xz1prP/jgAztgwAC7a9euDhPexo0bZ//pn/4p+b3rurZ///72wQcfbPT8a6+91v7d3/1dnWPjx4+3t99+e0brzFUtff2stTYWi9mJEyfaX/7yl/amm27q0OGtpa/fP/3TP9kLLrigzrE5c+bYSZMmZbTOTKiurrahUKjB+8yNN95or7jiikavmTx5sr377rvrHPs//+f/2E6dOlnXda3neXbKlCn2wgsvtH369LEPPPBApsrPBcfNZHSbot2sXLlSxcXFOvvss5PHpk6dKsdxtGrVqiavmzhxol588UWVl5fL8zwtXLhQVVVVmjJlSjtUnTvSff0qKyt1/fXX67HHHlNJSUl7lJp1NTU1WrNmjaZOnZo8lhhzs3LlykavWblyZZ3zJemSSy5p8vwTWTqvnyTdf//9rN2l9F6/iRMnas2aNcmu1cSYr9RtpYKisXFwnudpyZIlmjBhQqPXVFZWynHqRpLEpAZrrYwxevzxx7VkyRL17dtXc+fOzdwTCACWCkG7KS0tVZ8+feocC4fD6tGjR3KQamNeeuklTZ8+XT179lQ4HFZhYaFeeeUVDR06NNMl55R0X78777xTEydO1JVXXpnpEnNGWVmZXNdV37596xzv27evNm7c2Og1paWljZ5/rNf2RJXO67dixQo9/fTTWrduXTtUmNvSef2uv/765CB/a61isZj+8R//Uffcc097lNzm6q8Ht2DBAh05ckQzZ86UVLse3IMPPihJuvzyy/XII4/ozDPP1Pjx47V582bde++9uvzyy5Mh7plnnlFhYaG2bt2qHTt2aNCgQdl6ellHyxtabe7cuTLGHPOjqTes5rj33nt14MAB/fnPf9b777+vOXPm6Nprr9X69evb8FlkTyZfvz/84Q9aunSpFixY0LZFAykOHz6sG264QU899VSdtbvQfMuWLdN//dd/6ec//7nWrl2r3/3ud3rttdf0wAMPZLu0tEyfPl0PP/yw7rvvPp1xxhlat26dFi1alAy027dv165du5Lnz5s3T3fddZfmzZunkSNHatasWbrkkkv05JNPSpLeeecd/eQnP9Grr76qcePGadasWcnlRToiWt7QanfddZduvvnmY54zePBglZSUaM+ePXWOx2IxlZeXN9mdt2XLFv3sZz/TRx99pFGjRkmSxowZo+XLl+uxxx7TE0880SbPIZsy+fotXbpUW7ZsUXFxcZ3j11xzjc477zwtW7asFZXnrsQejPX3VNy9e3eTr1VjezAe6/wTWUtfvy1btuiLL77Q5ZdfnjzmeZ4kv3X4008/Ta7d1RGk8/N377336oYbbkjO1Bw9erSOHDmi2267Td///vcbdCkGwezZszV79uxGb6v/3hMOhzV//vxGZ49WVlbq5ptv1re//W2df/75OvnkkzV69Gg98cQT+va3v52J0nMe4Q2t1rt3b/Xu3fu4502YMEEHDhzQmjVrNHbsWEl+uPA8T+PHj2/0msrKSklqdCxE4pdD0GXy9Zs7d27yl0HC6NGj9ZOf/KTOL9oTTeqYm8RyFYkxN039Mknswfgv//IvyWOLFy9ucozOiaylr9+IESMatITPmzdPhw8f1k9/+lMNHDiwPcrOGen8/B1vzFdH9r3vfU/WWv3whz+U5O+f+vDDD+vuu+/WZZdd1jG7T5szq8Ey2xRt5NJLL7VnnnmmXbVqlV2xYoUdNmxYnaUuduzYYYcPH25XrVplrbW2pqbGDh061J533nl21apVdvPmzfbhhx+2xhj72muvZetpZE1LX7/GqIPMNl24cKHNz8+3zz77rP3kk0/sbbfdZouLi21paam11tobbrjBzp07N3n+22+/bcPhsH344Yfthg0b7Pz58zv8UiEtef3q6+izTVv6+s2fP9926dLF/t//+3/t559/bv/0pz/ZIUOG2GuvvTZbTyEnLFu2zIZCIbt8+fIGt1188cX2ggsusJ7nZaGyjGKpEOSWffv22euuu84WFRXZrl272pkzZ9rDhw8nb9+6dauVZP/yl78kj23atMleffXVtk+fPrawsNCefvrpDZYO6SjSef3q6yjhzdq6a0+NGzfOvvvuu8nbEmtPpXrppZfsKaecYvPy8uyoUaM65B8IqVr6+qXq6OHN2pa9ftFo1P77v/+7HTJkiC0oKLADBw60d9xxh92/f3/7F45sO24mY29TAACA3MHepgAAACcSwhsAAECAEN4AdBjWWk2dOlWXXHJJg9t+/vOfq7i4WDt27MhCZQDQfIQ3AB2GMUa/+tWvtGrVquTin5K0detW/eu//qseffRRfeUrX8lihQBwfExYANDhPPfcc5o9e7b++te/atCgQbrwwgtVXFys3/3ud9kuDQCOO2GB8AagQ7rqqqt08OBBXX311XrggQf08ccfN2uxZADIMMIbADRmz549GjVqlMrLy/Xb3/42uRI+AGQZS4UAQGP69Omj22+/XaeeeirBDUCgEN4AdFjhcFjhMFs8AwgWwhsAAECAEN4AAAAChPAGAAAQIMw2BQAAyB3MNgUAADiREN4AAAAChPAGAAAQIIQ3AACAACG8AQAABAjhDQAAIEAIbwAAAAFCeAMAAAgQwhsAAECAEN4AAAAChPAGAAAQIIQ3AACAACG8AQAABAjhDQAAIEAIbwAAAAFCeAMAAAgQwhsAAECAEN4AAAAChPAGAAAQIIQ3AACAACG8AQAABAjhDQAAIEAIbwAAAAFCeAMAAAgQwhsAAECAEN4AAAAChPAGAAAQIIQ3AACAACG8AQAABAjhDQAAIEAIbwAAAAFCeAMAAAgQwhsAAECAEN4AAAAChPAGAAAQIIQ3AACAACG8AQAABAjhDQAAIEAIbwAAAAFCeAMAAAgQwhsAAECAEN4AAAAChPAGAAAQIIQ3AACAACG8AQAABAjhDQAAIEAIbwAAAAFCeAMAAAgQwhsAAECAEN4AAAAChPAGAAAQIIQ3AACAACG8AQAABAjhDQAAIEAIbwAAAAFCeAMAAAgQwhsAAECAEN4AAAAChPAGAAAQIIQ3AACAACG8AQAABAjhDQAAIEAIbwAAAAFCeAMAAAgQwhsAAECAEN4AAAAChPAGAAAQIIQ3AACAACG8AQAABAjhDQAAIEAIbwAAAAFCeAMAAAgQwhsAAECAEN4AAAAChPAGAAAQIIQ3AACAACG8AQAABAjhDQAAIEAIbwAAAAFCeAMAAAgQwhsAAECAEN4AAAAChPAGAAAQIIQ3AACAACG8AQAABAjhDQAAIEAIbwAAAAFCeAMAAAgQwhsAAECAEN4AAAAChPAGAAAQIIQ3AACAACG8AQAABAjhDQAAIEAIbwAAAAFCeAMAAAgQwhsAAECAEN4AAAAChPAGAAAQIIQ3AACAACG8AQAABAjhDQAAIEAIbwAAAAFCeAMAAAgQwhsAAECAEN4AAAAChPAGAAAQIIQ3AACAACG8AQAABAjhDQAAIEAIbwAAAAFCeAMAAAiQcAvONRmrAgAAAM1CyxsAAECAEN4AAAAChPAGAAAQIIQ3AACAACG8AQAABAjhDQAAIEAIbwAAAAFCeAMAAAgQwhsAAECA/P9ft54oL+KAhwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1200x800 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from matplotlib import cm\n",
    "from matplotlib.ticker import LinearLocator, FormatStrFormatter\n",
    "\n",
    "%matplotlib inline\n",
    "plt.rcParams['figure.figsize'] = [12, 8]\n",
    "plt.rcParams['figure.dpi'] = 100 # 200 e.g. is really fine, but slower\n",
    "mp = tm.plot_visuals(\"base_link\", ax_s=1, alpha=0.5, convex_hull_of_mesh=True)\n",
    "print(mp)\n",
    "mp.azim = 0\n",
    "mp.elev = 0\n",
    "# mp.dist = 10\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "85b5a86c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "b8f8b30f",
   "metadata": {},
   "outputs": [
    {
     "ename": "KeyError",
     "evalue": "\"Joint 'base_link' is not known\"",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_4819/3303182620.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0mtm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_joint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"joint_left_wheel\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0.5\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;31m# tm.set_joint(\"joint_head_pan\", 0.5 * np.pi / 2)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mtm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_joint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"base_link\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0.5\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m~/droidlet/droidlet/lowlevel/hello_robot/remote/droidlet/lib/python3.8/site-packages/pytransform3d/urdf.py\u001b[0m in \u001b[0;36mset_joint\u001b[0;34m(self, joint_name, value)\u001b[0m\n\u001b[1;32m     99\u001b[0m         \"\"\"\n\u001b[1;32m    100\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mjoint_name\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_joints\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 101\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Joint '%s' is not known\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mjoint_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    102\u001b[0m         \u001b[0mfrom_frame\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mto_frame\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchild2parent\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlimits\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjoint_type\u001b[0m \u001b[0;34m=\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    103\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_joints\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mjoint_name\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyError\u001b[0m: \"Joint 'base_link' is not known\""
     ]
    }
   ],
   "source": [
    "tm.set_joint(\"joint_left_wheel\", 0.5 * np.pi)\n",
    "# tm.set_joint(\"joint_head_pan\", 0.5 * np.pi / 2)\n",
    "tm.set_joint(\"base_link\", 0.5 * np.pi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cc13f102",
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "mp = tm.plot_visuals(\"base_link\", ax_s=0.1, alpha=0.5, convex_hull_of_mesh=True)\n",
    "print(mp)\n",
    "mp.azim = 0\n",
    "mp.elev = 0\n",
    "mp.dist = 100\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "0be94058",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 9.97893319e-01,  6.48650746e-02, -1.20275539e-03,\n",
       "        -1.67791984e-02],\n",
       "       [ 1.07329367e-03,  2.03067110e-03,  9.99997362e-01,\n",
       "        -1.31301041e+00],\n",
       "       [ 6.48673459e-02, -9.97891977e-01,  1.95677384e-03,\n",
       "         1.46875778e-02],\n",
       "       [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
       "         1.00000000e+00]])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tm.get_transform('base_link', 'camera_link')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "92586605",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<pytransform3d.visualizer._figure.Figure at 0x7f5ab20634c0>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fig = pv.figure()\n",
    "fig.plot_graph(tm, \"base_link\", s=0.1, show_visuals=True)\n",
    "fig.view_init()\n",
    "fig"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "45bcfe32",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Open3D INFO] Resetting default logger to print to terminal.\n",
      "[Open3D INFO] WebRTC GUI backend enabled.\n"
     ]
    }
   ],
   "source": [
    "import open3d as o3d\n",
    "from open3d.web_visualizer import draw\n",
    "o3d.visualization.webrtc_server.enable_webrtc()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b94b0e21",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Open3D INFO] Window window_0 created.\n",
      "[Open3D INFO] EGL headless mode enabled.\n",
      "[Open3D INFO] ICE servers: {\"stun:stun.l.google.com:19302\", \"turn:user:password@34.69.27.100:3478\", \"turn:user:password@34.69.27.100:3478?transport=tcp\"}\n",
      "FEngine (64 bits) created at 0x7f06dc006cd0 (threading is enabled)\n",
      "[Open3D INFO] Set WEBRTC_STUN_SERVER environment variable add a customized WebRTC STUN server.\n",
      "[Open3D INFO] WebRTC Jupyter handshake mode enabled.\n",
      "EGL(1.5)\n",
      "OpenGL(4.6)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Exception in thread Thread-7:\n",
      "Traceback (most recent call last):\n",
      "  File \"/usr/lib/python3.8/threading.py\", line 932, in _bootstrap_inner\n",
      "    self.run()\n",
      "  File \"/usr/lib/python3.8/threading.py\", line 870, in run\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "  File \"/home/hello-robot/droidlet/droidlet/lowlevel/hello_robot/remote/droidlet/lib/python3.8/site-packages/open3d-0.13.0-py3.8-linux-x86_64.egg/open3d/web_visualizer.py\", line 145, in _thread_main\n",
      "    retval = task.func()\n",
      "  File \"/home/hello-robot/droidlet/droidlet/lowlevel/hello_robot/remote/droidlet/lib/python3.8/site-packages/open3d-0.13.0-py3.8-linux-x86_64.egg/open3d/visualization/draw.py\", line 48, in draw\n",
      "    add(geometry, n)\n",
      "  File \"/home/hello-robot/droidlet/droidlet/lowlevel/hello_robot/remote/droidlet/lib/python3.8/site-packages/open3d-0.13.0-py3.8-linux-x86_64.egg/open3d/visualization/draw.py\", line 40, in add\n",
      "    w.add_geometry(\"Object \" + str(n), g)\n",
      "TypeError: add_geometry(): incompatible function arguments. The following argument types are supported:\n",
      "    1. (self: open3d.cpu.pybind.visualization.O3DVisualizer, name: str, geometry: open3d.cpu.pybind.geometry.Geometry3D, material: open3d.cpu.pybind.visualization.rendering.Material = None, group: str = '', time: float = 0.0, is_visible: bool = True) -> None\n",
      "    2. (self: open3d.cpu.pybind.visualization.O3DVisualizer, name: str, geometry: open3d.cpu.pybind.t.geometry.Geometry, material: open3d.cpu.pybind.visualization.rendering.Material = None, group: str = '', time: float = 0.0, is_visible: bool = True) -> None\n",
      "    3. (self: open3d.cpu.pybind.visualization.O3DVisualizer, name: str, model: open3d.cpu.pybind.visualization.rendering.TriangleMeshModel, material: open3d.cpu.pybind.visualization.rendering.Material = None, group: str = '', time: float = 0.0, is_visible: bool = True) -> None\n",
      "    4. (self: object, arg0: dict) -> None\n",
      "\n",
      "Invoked with: <open3d.cpu.pybind.visualization.O3DVisualizer object at 0x7f06fcaf99b0>, 'Object 1', <pytransform3d.visualizer._figure.Figure object at 0x7f070c3af550>\n"
     ]
    }
   ],
   "source": [
    "draw(fig)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "13dd2c6c",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
